package com.sky.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;

/**
 * MyBatis-Plus 元数据自动填充配置
 * 用于自动填充创建时间、修改时间、创建人、修改人等公共字段
 */
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    /**
     * 插入时的填充策略
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        // 填充创建时间和修改时间
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
        this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());

        // 获取当前登录用户ID
        Long currentUserId = getCurrentUserId();

        // 填充创建人和修改人，使用fillStrategy更灵活，字段不存在时会忽略
        this.fillStrategy(metaObject, "createUser", currentUserId);
        this.fillStrategy(metaObject, "updateUser", currentUserId);
    }

    /**
     * 更新时的填充策略
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        // 填充修改时间
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());

        // 获取当前登录用户ID并填充修改人
        Long currentUserId = getCurrentUserId();
        this.fillStrategy(metaObject, "updateUser", currentUserId);
    }

    /**
     * 获取当前登录用户ID
     * 增加空值处理，提高代码健壮性
     */
    private Long getCurrentUserId() {
        try {
            // 从ThreadLocal中获取当前用户ID
            Long userId = UserContext.getCurrentUserId();
            // 如果获取不到用户ID，返回一个默认值（根据业务需求调整）
            return userId != null ? userId : 0L;
        } catch (Exception e) {
            // 发生异常时返回默认值，避免填充过程中断
            return 0L;
        }
    }
}
